package com.gxa.sideParking.admin.handler;

import com.gxa.sideParking.core.common.JsonResult;
import com.gxa.sideParking.core.common.ResponseUtil;
import com.gxa.sideParking.core.exception.BusinessException;
import com.gxa.sideParking.core.exception.ErrorCode;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;

/**
 * 全局异常处理器
 * @ControllerAdvice: 被Spring管理的bean,对所有的控制器进行aop的切入
 * 作用: 专门对controller中的异常进行处理,service/dao中的异常要集中抛给controller
 *
 * 且当前类可以定义所有Controller的方法
 */

@RestController
@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 集中处理异常的方法
     * @ExceptionHandler 表明该方法是一个异常的处理方法(环绕通知)
     * 作用相当于:
     * try{
     *     method()  // 带有异常的抛出
     * }catch(Throwable e){
     *  e对象可以操作
     * }
     *
     *
     *ExceptionHandler的参数中需要value(默认 {})
     * 注解中只有value属性在赋值的时候可以省略
     * {} 表明是一个数组的赋值方式,单个值的时候可以省略{}
     * 参数类型是Throwable,那么所有的Exception和Error都可以作为参数
     * 表明: ExceptionHandler可以捕获异常和错误
     *
     * 参数throwable会得到异常对象(Spring的注入方法): 多态的处理方式
     *
     */
    @ExceptionHandler(Throwable.class)
    public JsonResult handle(Throwable throwable){

        // 针对业务异常
        if(throwable instanceof BusinessException){
            //System.out.println("这是一个业务异常");

            // 硬编码方式: 不提倡
          //  return ResponseUtil.failed(50001,throwable.getMessage());

            // 建议: 用ErrorCode获取信息
            Integer code = ((BusinessException) throwable).getErrorCode().getCode();
            String message = ((BusinessException) throwable).getErrorCode().getMessage();
            return ResponseUtil.failed(code,message);
        }
       /* else if(throwable instanceof IncorrectCredentialsException){
            // 针对系统异常
        }
*/
        //FIXME: 添加对UnauthorizedException的处理

        else{
            // 针对系统异常
            //System.out.println("这是一个系统异常");
            // 运用流的方法来记录日志
            // TODO: 使用日志框架来完成
            System.out.println("throwable:"+throwable);
            ErrorCode systemError = ErrorCode.SYSTEM_ERROR;
            return ResponseUtil.failed(systemError.getCode(),systemError.getMessage());

        }

        //System.out.println("throwable:"+throwable);
        //System.out.println("处理方法被执行了");
    }

}
